package org.fdy.common.core.units;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * pdf 转为图片
 *
 * @author fangdy
 * @create 2023-11-30 14:41
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PdfToImageUtils {

    /**
     * <p>
     * pdf转为n页图片 以base64集合的格式返回
     * 注意 当中文无法正常显示是 需在服务器上面安装对应的字体
     * 安装字体的方法
     * cd /usr/share/fonts/   // 进入系统自带的字体目录
     * mkdir myfonts  // myfonts 是你自己随便取得文件夹名字
     * 将字体文件拷贝到这个文件夹下，在cd /usr/share/fonts/目录下执行以下命令
     * mkfontscale
     * mkfontdir
     * fc-cache -fv           //更新字体缓存
     * source /etc/profile    // 执行以下命令让字体生效
     * fc-list    // 查看系统中所有得字体，可用于测试是否安装字体成功
     * </p>
     *
     * @param input pdf 文件流
     * @param type  要转换的文档类型
     * @return
     */
    public static List<String> pdf2Base64pngFromStream(InputStream input, String type) {
        List<String> list = new ArrayList<>();
        try {
            PDDocument doc = PDDocument.load(input);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                try (ByteArrayOutputStream osOut = new ByteArrayOutputStream();) {
                    // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                    ImageIO.write(image, type, osOut);
                    byte[] osByteOut = osOut.toByteArray();
                    BASE64Encoder encoder = new BASE64Encoder();
                    String outstr = encoder.encode(osByteOut);
                    list.add(outstr);
                }
            }
        } catch (Exception e) {
            log.error("pdf转换为图片异常", e);
            return null;
        }
        return list;
    }
}
